#ifndef FLOWCONTROL_H
#define FLOWCONTROL_H

#include <iostream>
#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QString>
#include <QDebug>
#include <QThread>
#include <QChartView>
#include <QLineSeries>
#include <QPieSeries>
#include <QtCharts/QtCharts>
#include <QTimer>
#include <QVector>
#include "chart.h"
#include <QFileDialog>
#include <mainwindow2.h>

using namespace std;
using namespace QtCharts;

QT_BEGIN_NAMESPACE
namespace Ui
{
    class FlowControl;
}
QT_END_NAMESPACE

class FlowControl : public QWidget
{
    Q_OBJECT

public:
    FlowControl(QWidget *parent = nullptr);
    ~FlowControl();

    /**
     * @brief 串口打开成功
     */
    void openPortSuccess();

    /**
     * @brief 串口关闭成功
     */
    void closePortSuccess();

    /**
     * @brief 图表绘制
     */
    void flow_chart(void);

    /**
     * @brief 流量线程处理程序
     */
    void threadProcessFlow();

    /**
     * @brief 压力计程处理程序
     */
    void threadProcessPress();

    /**
     * @brief 温度计线程处理程序
     */
    void threadProcessTemp();

    /**
     * @brief 温度计线程处理程序
     */
    void threadProcessFile();

    QString fileNames;

signals:
    /**
     * @brief 开启串口
     */
    void openFlowPort(QString COM, QString command);

    void openPressPort(QString COM, QString command);

    void openTempPort(QString COM, QString command, int tempFlag);

    /**
     * @brief 关闭串口
     */
    void closeFlowPort();
    void closePressPort();
    void closeTempPort();

    /**
     * @brief 主线程发送数据
     * @param data
     */
    void serialDataSend(const QByteArray data);

    /**
     * @brief 压力计数据准备好
     * @param data
     * @return
     */
    QString readyReadPress(QByteArray data);

    /**
     * @brief 压力计数据准备发送
     * @param data
     */
    void serialDataSendPress(const QByteArray data);

    /**
     * @brief 温度计指令发送
     * @param data
     */
    void serialDataSendTemp(const QByteArray data);

    /**
     * @brief 数据准备完成
     * @param resData
     */
    void chartDataReady(double resData, int flag);
    void chartDataReady2(double pressData, int flag);
    void chartDataReady3(double tempData, int flag);
    void fileDataReady(QString flowData, QString pressData, QString tempData);

public slots:

    /**
     * @brief 处理流量数据
     */
    void handleFlowResults(QString result);

    /**
     * @brief 处理压力数据
     * @param result
     */
    void handlePressResults(QString result);

    /**
     * @brief 处理温度数据
     * @param result
     */
    void handleTempResults(QString result);

private slots:

    /**
     * @brief 点击打开连接
     */
    void on_pushButton_clicked();

    /**
     * @brief 点击关闭连接
     */
    void on_pushButton_2_clicked();

    /**
     * @brief 打开压力计的串口
     */
    void on_pushButton_12_clicked();

    /**
     * @brief 关闭压力计的串口
     */
    void on_pushButton_13_clicked();

    /**
     * @brief 打开温度计，配置相关值
     */
    void on_pushButton_17_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_7_clicked();

private:
    Ui::FlowControl *ui;
    // 定义相关串口
    QSerialPort m_port;         // 流量计串口
    QSerialPort m_port_pressur; // 压力计串口
    QSerialPort m_port_temp;    // 温度计串口
    // 使用子线程读取数据
    QThread threadPortTemp;     // 温度计串口线程
    QThread threadPortFlow;     // 流量计串口线程
    QThread threadPortPressur;  // 压力计串口线程
    QThread threadFileWorker;   // 文件读写子线程
    // 全局变量
    QString timeStr;
    double pressData = 0;   // 记录压力数据
    double tempData = 0;    // 记录温度数据
    // 图表相关指针
    Chart* chart;   // 流量图表指针
    MainWindow2* new_win; //弹出窗口的指针
};
#endif // FLOWCONTROL_H

